#include "wxspanelres.h"
#include "wxsitemresdata.h"
#include "wxsflags.h"
#include "scrollingdialog.h"
#include <wx/button.h>

using namespace wxsFlags;

namespace {
  class wxsPanelResPreview: public wxScrollingDialog {
    public:

      wxsPanelResPreview( wxWindow* Parent, wxsItemResData* Data ): m_Data( Data ) {
        Create( Parent, -1, _T( "Preview for wxPanel class" ), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
        wxObject* PreviewObj = m_Data->GetRootItem()->BuildPreview( this, pfExact );
        wxWindow* PreviewWnd = wxDynamicCast( PreviewObj, wxWindow );
        if( !PreviewWnd ) {
          delete PreviewObj;
        } else {
          wxSizer* Sizer = new wxBoxSizer( wxHORIZONTAL );
          Sizer->Add( PreviewWnd, 0, wxEXPAND, 0 );
          SetSizer( Sizer );
          Sizer->Layout();
          Sizer->SetSizeHints( this );
        }
        Center();
        wxAcceleratorEntry Acc[1];
        Acc[0].Set( wxACCEL_NORMAL, WXK_ESCAPE, wxID_EXIT );
        wxAcceleratorTable Table( 1, Acc );
        SetAcceleratorTable( Table );
      }

      ~wxsPanelResPreview() {
        m_Data->NotifyPreviewClosed();
      }

      void OnEscape( M_Code_unused wxCommandEvent& event ) {
        Close();
      }

      void OnClose( M_Code_unused wxCloseEvent& event ) {
        Destroy();
      }

      void OnButton( wxCommandEvent& event ) {
        wxWindowID Id = event.GetId();
        if( Id == wxID_OK  ||
            Id == wxID_APPLY ||
            Id == wxID_CANCEL ) {
          Close();
        }
      }

      wxsItemResData* m_Data;

      DECLARE_EVENT_TABLE()
  };

  BEGIN_EVENT_TABLE( wxsPanelResPreview, wxScrollingDialog )
    EVT_MENU( wxID_EXIT, wxsPanelResPreview::OnEscape )
    EVT_CLOSE( wxsPanelResPreview::OnClose )
    EVT_BUTTON( wxID_ANY, wxsPanelResPreview::OnButton )
  END_EVENT_TABLE()
}

const wxString wxsPanelRes::ResType = _T( "wxPanel" );

wxWindow* wxsPanelRes::OnBuildExactPreview( wxWindow* Parent, wxsItemResData* Data ) {
  wxScrollingDialog* Dlg = new wxsPanelResPreview( Parent, Data );
  Dlg->Show();
  return Dlg;
}
